'use strict';
// require 加载的文件格式为：.js .json .node
// 加载js文件时，js文件必须有module.exports或者exports
// 加载.json文件时，是JSON.parse导出一个对象
// 加载.node文件时，用的是一个c++的插件addOns，是利用process.dlopen打开一个文件
// 如果require加载的不是上面的三种文件格式，剩下全部按照.js文件进行解析
// import pkg from '../package.json' assert { type: 'json' }
// 命令行打印插件
import log from '@breeze-cli-dev/log'
// 引入init执行模块
// import { init } from '@breeze-cli-dev/init'
import { exec } from '@breeze-cli-dev/exec'

import path from 'path'
import { fileURLToPath } from 'url'
import fs from 'fs'
// os模块是node内置的，可以获取系统相关的信息
import os from 'os'
// 引入控制台输出添加颜色
import colors from 'colors'
// 引入minimist库，检查指令参数
import minimist from 'minimist'
import constant from './const.js'
// 判断cli版本
import { getNpmSemverVersion } from '@breeze-cli-dev/get-npm-info';
// 引入命令注册
import { Command } from 'commander'
const program = new Command();
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../package.json'), 'utf-8'))
async function core() {
  try {
    checkPkgVersion();
    checkRoot();
    checkUserHome();
    // checkInputArgs();
    checkEnv();
    await checkGlobalUpdate()
    registerCommand()
  } catch (e) {
    log.error(e.message)
  }
}
// command命令注册
function registerCommand() {
  program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug', '是否开启调试模式', false)
    .option('-t, --targetPath <targetPath>', '是否指定本地调试文件路径', '');
  // 注册init命令 
  program
   .command('init [projectName]')
   .option('-f, --force', '是否强制初始化项目')
   .action(exec)
  // 监控debug参数
  program.on('option:debug', function() {
    const currentDebug = program.opts().debug;
    if (currentDebug) {
      process.env.LOG_LEVEL = 'verbose'
    } else {
      process.env.LOG_LEVEL = 'info'
    }
    log.level = process.env.LOG_LEVEL
    log.verbose('debug日志打印开启')
  });
  // 监控未知命令
  program.on('command:*', function(obj) {
    // 获取已注册的命令
    const registeredCommands = program.commands.map(cmd => cmd.name());
    const availableCommands = registeredCommands.join(', ');
    console.log(colors.red('未知命令', obj[0]));
    console.log(`可用命令: ${availableCommands}`);
  })
  // 监控targetPath参数
  program.on('option:targetPath', function() {
    const targetPath = program.opts().targetPath;
    if (targetPath) {
      process.env.CLI_TARGET_PATH = targetPath;
    }
  })
  program.parse(process.argv);
  if (program.args && program.args.length < 1) {
    program.outputHelp();
    console.log();
  }
}
// 检查cli版本号
function checkPkgVersion() {
  log.notice('breeze-cli', `breeze-cli-dev版本号：${pkg.version}`)
}
// 检查root账户
function checkRoot() {
 
}
// 检查用户目录
function checkUserHome() {
  const userHome = os.homedir()
  if (!userHome || !fs.existsSync(userHome)) {
    throw new Error(colors.red('当前用户主目录不存在'))
  }
}
// 检查用户的指令参数
function checkInputArgs() {
  const args = minimist(process.argv.splice(2))
  if (args.debug) {
    process.env.LOG_LEVEL = 'verbose'
  } else {
    process.env.LOG_LEVEL = 'info'
  }
  log.level = process.env.LOG_LEVEL
}
// 读取env文件并创建默认值
function checkEnv() {
  const userHome = os.homedir()
  const cliConfig = {
    home: userHome,
  };
  if (process.env.CLI_HOME) {
    cliConfig.cliHome = path.join(userHome, process.env.CLI_HOME)
  } else {
    cliConfig.cliHome = path.join(userHome, constant.DEFAULT_CLI_HOME)
  }
  process.env.CLI_HOME_PATH = cliConfig.cliHome;
}
// 检查版本更新
async function checkGlobalUpdate() {
  try {
    const res = await getNpmSemverVersion(pkg.version, pkg.name) // 替换为 await
    if (res) {
      log.warn(colors.yellow(`请手动更新 ${pkg.name}，当前版本：${pkg.version}，最新版本：${res}
      更新命令： npm install -g ${pkg.name}`))
    }
  } catch (err) {
    log.error('版本检查失败', err) // 添加错误日志
  }
}
export default core